// 1.求 1-100 的和
// function sum(n) {
//   if (n === 1) return 1
//   return sum(n - 1) + n
// }

// console.log(sum(100))


// 2.斐波那契数列
// 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 求第 n 项
// function febo(n) {
//   if ([1, 2].includes(n)) return 1
//   return febo(n - 1) + febo(n - 2)
// }

// console.log(febo(7))


// 3.爬楼梯
// js 递归案例：假设楼梯有 n 个台阶，每次可走1个或2个台阶，问走完这 n 个台阶有几种走法
// function climb(n) {
//   if (n === 1) return 1
//   if (n === 2) return 2
//   return climb(n - 1) + climb(n - 2)
// }
// console.log(climb(5))

// 4.深拷贝
// function clone(obj) {
//   let temp = {}
//   for (let i in obj) {
//     if (typeof obj[i] === 'object') {
//       temp[i] = clone(obj[i])
//     } else {
//       temp[i] = obj[i]
//     }
//   }
//   return temp
// }

// let obj = {
//   name: 'recursive',
//   age: '1',
//   like: {
//     bing: '111',
//     cing: '222'
//   }
// }
// console.log(clone(obj))


// 5.阶乘，求 n 的阶乘
// function fn(n) {
//   if (n === 1) return 1
//   return n * fn(n - 1)
// }
// console.log(fn(5))


// 功能要求：拿到每一级的最后一个数据的name值，即
// let data = [
//   {
//     name: "所有物品",
//     children: [
//       {
//         name: "水果",
//         children: [{name: "苹果", children: [{name: '青苹果'}, {name: '红苹果'}]}]
//       },
//       {
//         name: '主食',
//         children: [
//           {name: "米饭", children: [{name: '北方米饭'}, {name: '南方米饭'}]}
//         ]
//       },
//       {
//         name: '生活用品',
//         children: [
//           {name: "电脑类", children: [{name: '联想电脑'}, {name: '苹果电脑'}]},
//           {name: "工具类", children: [{name: "锄头"}, {name: "锤子"}]},
//           {name: "生活用品", children: [{name: "洗发水"}, {name: "沐浴露"}]}
//         ]
//       }
//     ]
//   }
// ]

// function fn (data, arr = []) {
//   data.forEach(item => {
//     if (item.children && item.children.length > 0) {
//       fn(item.children, arr)
//     } else {
//       arr.push(item.name)
//     }
//   })
//   return arr
// }

// console.log(fn(data))


// 依次输出1,2,3,4,5，每个输出中间间隔1s。
// function fn(i) {
//   console.log(i)
//   setTimeout(() => {
//     if (i > 4) return
//     i++
//     return fn(i)
//   }, 1000)
// }

// fn(1)

// 要求：传入id，删除当前id元素，并删除对应next中的id元素，直至子节点全部删除
/**
 * 思路：拿到 id 在数组中的对象，并将对象放入中转站中，得到 id 对应的next数组
 * 如果id 对象存在，从数组中删除对象
 * 如果 next.length > 0 遍历 next 对象，得到 id，将开始递归
 */
let arr = [
  { id: 1, next: [2, 3] },
  { id: 2, next: [4] },
  { id: 3, next: [4, 5] },
  { id: 4, next: [] },
  { id: 5, next: [] },
  { id: 6, next: [7, 8] },
  { id: 7, next: [9, 10] },
  { id: 8, next: [] },
  { id: 9, next: [] },
  { id: 10, next: [] }
]

function recursive(arr, id) {
  const curNode = arr.filter(item => item.id === id)[0]
  if (curNode) {
    arr.splice(arr.findIndex(item => item.id === id), 1)
    if (curNode.next.length !== 0) {
      curNode.next.forEach(item => recursive(arr, item))
    }
  }
}

recursive(arr, 1)
console.log(arr)